/**
 * @addtogroup sfc_api.h
 * sfc_api.h
 * @{
 */
/**
 * @file sfc_api.h
 * @brief 操作系统相关的函数以及重新定义的变量类型和常量等
 * @note
 * @author Leo
 * @date 2020-07-29
 * @version 1.1

 * @par          修改日志
 * <table>
 * <tr><th>Date <th>Version <th>Author <th>Description
 * <tr><td>2019-07-03 <td>1.0 <td>Leo <td>创建初始版本
 * <tr><td>2020-07-29 <td>1.1 <td>Leo <td>去掉与rtx相关定义,保证不同操作系统上的通用
 * <tr><td>2020-11-17 <td>1.2 <td>Leo <td>加入获取当前CPU占用率的函数SfGetCpuRate
 * @copyright 杭州鸿泉物联网技术股份有限公司
 */

#ifndef _SFC_API_H_
#define _SFC_API_H_

#include <ofc_types.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef void *TSfThreadHandle; ///< 线程的句柄
typedef void *TSfEventExHandle; ///< 互斥量的句柄
typedef void *TSfCriticalSectionHandle; ///< 临界区的句柄
typedef void *TSfSemaphoreHandle; ///< 信号量的句柄
typedef void *TSfMsgQueueHandle;  ///< 消息队列的句柄

 /**
 * 获取当前的系统时间回调函数
 */   
typedef TTime(*TSfcGetSysTimeCb)(void);
/**
 * 设置获取当前的系统时间回调
 */
void SfSetGetSysTimeCallback(TSfcGetSysTimeCb cb);
    
/**
 * 设置系统时间回调函数
 */   
typedef void (*TSfcSetSysTimeCb)(TTime time);
/**
 * 设置获取当前的系统时间回调
 */
void SfSetSysTimeCallback(TSfcSetSysTimeCb cb);


/**
 * 线程优先级的枚举
 */
typedef enum TSfThreadPriorityTag TSfThreadPriority;
enum TSfThreadPriorityTag
{
    kSfThreadPriorityLow,
    kSfThreadPriorityBelowNormal,
    kSfThreadPriorityNormal,
    kSfThreadPriorityNormalPlus,
    kSfThreadPriorityAboveNormal,
    kSfThreadPriorityHigh,
    kSfThreadPriorityRealtime,
};

/**
 * 线程休眠函数
 * @param ms: 休眠时长,单位: ms
 * @return 无返回值
 */
void SfSleep(UInt32 ms);

/**
* 得到当前的tick数,单位: 毫秒
* @return tick数
*/
UInt32 SfGetTickCount(void);

/**
 * 内核锁定,禁止线程调度
 * @note
 *   -# 不支持嵌套调用
 *   -# 锁定后应当快速处理完成,并立即调用[SfKernelUnlock](@ref SfKernelUnlock)
 *   -# 不得在中断中使用
 * @return 无返回值
 */
void SfKernelLock(void);

/**
 * 内核解锁
 * @return 无返回值
 */
void SfKernelUnlock(void);

/**
 * 获取当前CPU的占用率;最大100(繁忙),最小0(空闲)
 * @return 返回当前CPU的占用率，若返回<0表示未实现
 */
Int32 SfGetCpuRate(void);

/**
 * 获取当前的系统时间,调用前需设置获取时间回调，@ref TSfcGetSysTimeCb
 * @return 返回UTC时间
 */
TTime SfGetSystemTime(void);

/**
 * 设置系统时间,调用前需设置设置时间回调，@ref TSfcSetSysTimeCb
 * @return 返回UTC时间
 */
void SfSetSystemTime(TTime time);


#ifdef __cplusplus
}  // extern "C"
#endif

#endif  // _SFC_API_H_

/**
 * @}
 */
